package inherit;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * user:likai
 * Date:2022-09-13
 * Time:10:54
 */
//extends 继承（就是对共性的抽取从而对代码的重读使用） 子类继承父类
    //子类也叫做派生类
    //父类也叫做基类或者超类
    //一般情况继承不要超过三层
    //私有的成员可以被继承但不能被访问
    //父类和子类同名变量时，赋值子类，就近原则
    //方法名字一样的，有参数的找有参数的子类或者父类中的方法中
    //在Java中只能继承一个类
class Animals{
    public String name;
    public int age;
    public void eat() {
        System.out.println(name + "吃饭");
    }
    //当添加构造方法后，导致子类出现错误，不添加时系统本身调用初始化不会出错。
    public Animals(String name,int age){
        this.name=name;
        this.age=age;
    }
}
//super只会访问从父类继承过来的，this优先访问子类自己的，如果自己没有就是访问父类的。



//重写
//1.方法名称一样 2.返回值一样（返回值构成父子关系也可以） 3.参数一样
//private修饰的方法不能重写
//final修饰的方法也不能重写，final修饰的方法叫做密封方法
class Dog extends Animals{
//    public String name;
//    public int age;
    public void barks(){
        System.out.println(name+"汪汪叫！");
    }
//    public void eat(){
//        System.out.println(name+"吃饭");
//    }
    boolean silly;
    //需要用super.()来给父类的成员变量初始化
    //必须先初始父类，在初始子类
    public Dog(String name,int age,boolean silly){
        super(name, age);
        this.silly=silly;
    }
}
class Cat extends Animals{
//    public String name;
//    public int age;
    public Cat(){
        super("laifu",5);
    }

    //带参数的构造方法
    public Cat(String name,int age){
        super(name, age);
    }
    public void barks(){
        System.out.println(name+"咪咪叫！");
    }
//    public void eat(){
//        System.out.println(name+"吃饭");
//    }
    public void catchMouse(){
        System.out.println(name+"正在抓老鼠");
    }

}


public class Test {
    public void main(String[] args) {
        Dog dog=new Dog("laifu",10,true);
        dog.name="来福";
        dog.age=10;
        dog.barks();
    }
}
